package com.ruyuan.eshop.order.statemachine.action;

/**
 * T 表示入参，R表示出参
 * 儒猿课堂: http://www.ruyuan2020.com
 * @Author zhonghuashishan
 * @Remark 有问题直接联系客服VX: ruyuan-1111 ，源码-笔记-技术交流群
 * @Version 1.0
 **/
public abstract class AbstractStateAction<T, R, E> implements StateAction<E> {

    @Override
    @SuppressWarnings("unchecked")
    public void onStateChange(E event, Object context) {
        R r = onStateChangeInternal(event, (T) context);
        postStateChange(event, r);
    }

    /**
     * 状态变更后置操作
     *
     * @param event   事件
     * @param context 上下文
     */
    protected void postStateChange(E event, R context) {
        // 默认空实现，提供给子类一个钩子
    }

    /**
     * 状态变更操作
     *
     * @param event   事件
     * @param context 上下文
     * @return 返回标准的数据，正向是OrderInfoDTO, 逆向是AfterSaleStateMachineDTO
     */
    protected abstract R onStateChangeInternal(E event, T context);

}
